当函数调用的参数是初始化列表时，参数没有特定的类型，通常不会从一对给定的(A, P)进行推断，因为没有A。例如:

\begin{lstlisting}[style=styleCXX]
#include <initializer_list>

template<typename T> void f(T p);

int main() {
	f({1, 2, 3}); // ERROR: cannot deduce T from a braced list
}
\end{lstlisting}

然而，若参数类型P在除去引用，以及const和volatile限定符后，等价于某些类型P0的std::initializer\_list，这种类型的P0可推导。通过将P0与初始化列表中每个元素的类型进行比较，只有当所有元素都具有相同类型时，推导才会成功:

\hspace*{\fill} \\ %插入空行
\noindent
\textit{basics/initlist.cpp}
\begin{lstlisting}[style=styleCXX]
#include <initializer_list>

template<typename T> void f(std::initializer_list<T>);

int main()
{
	f({2, 3, 5, 7, 9}); // OK: T is deduced to int
	f({’a’, ’e’, ’i’, ’o’, ’u’, 42}); // ERROR: T deduced to both char and int
}
\end{lstlisting}

类似地，若参数类型P是一个类型数组的引用(可推导)，推导过程也会将初始化列表的每个元素的类型与P类型数组的元素类型进行比较，当所有元素都有相同的类型时，推导才成功。此外，若(数组)边界可推导(即，只指定非类型模板参数)，那么该边界会推导为初始化列表中元素的数量。












































